package com.teamsun.service;

import com.teamsun.entity.OffLineDownLoad;
import com.teamsun.entity.RptResult;
import com.teamsun.exception.ServiceException;
import com.teamsun.rptcfg.BaseRpt;
import com.teamsun.rptcfg.SelectDim;
import com.teamsun.rptcfg.TreeDim;

import java.util.List;
import java.util.Map;

/**
 * <p>展示报表服务</p>
 * <p>展示报表相关的方法都在该服务中</p>
 */
public interface IShowRptService {

    /**
     * 查询报表数据信息(无汇总信息)
     * @param baseRpt  报表信息实体类
     * @param params 查询条件
     * @return
     */
    RptResult queryRptInfo(BaseRpt baseRpt, Map<String, String> params) throws ServiceException;

    /**
     * 分页查询报表数据信息
     * @param baseRpt  报表信息实体类
     * @param params  查询条件
     * @param startIndex  分页起始行
     * @param endIndex  分页结束行
     * @param rows 每页显示条数
     * @return
     */
    RptResult queryRptInfoByPage(BaseRpt baseRpt, Map<String, String> params, int startIndex, int endIndex, int rows) throws ServiceException;

    /**
     * 查询下拉框的值(如果查询类型为下拉框且下拉框的值需从数据库中查询)
     * @param selectDim 维度表信息配置
     * @param rptInfo 下拉框所属的报表信息
     * @return
     */
    Map<String, String> querySelectValue(SelectDim selectDim, BaseRpt rptInfo);

    /**
     * 查询树形数据(如果查询类型为树则需要在数据库中查询数据)
     * @param treeDim 维度表信息配置
     * @param param 权限条件(code权限)
     * @param parentParam 权限条件(upcode权限)
     * @param parentId 父节点ID
     * @param rptInfo 树所属的报表信息
     * @return
     */
    List<Map<String, Object>> queryTreeData(TreeDim treeDim, String param, String parentParam, String parentId, BaseRpt rptInfo);

    /**
     * 根据用户输入的搜索名称，查询树信息
     * @param treeDim 维度表信息配置
     * @param param 权限条件(code权限)
     * @param parentParam 权限条件(upcode权限)
     * @param parentId 父节点ID
     * @param rptInfo 树所属的报表信息
     * @param searchName 搜索的名称
     * @return
     */
    List<Map<String, Object>> queryTreeData(TreeDim treeDim, String param, String parentParam, String parentId, BaseRpt rptInfo, String searchName);

    /**
     * 查询树信息
     * @param treeDim 维度表信息配置
     * @param rptInfo 树所属的报表信息
     * @param defaultValue 默认已选的节点
     * @return
     */
    List<Map<String, Object>> queryTreeData(TreeDim treeDim, BaseRpt rptInfo, String defaultValue);


    /**
     * 获取查询SQL语句
     * @param baseRpt  报表信息实体类
     * @param params  查询条件
     * @return
     */
    OffLineDownLoad getQuerySQL(BaseRpt baseRpt, Map<String, String> params);

    /**
     * 获取查询数据量的SQL
     * @param baseRpt 报表实体信息
     * @param params 查询条件
     * @return
     */
    String getCountSQL(BaseRpt baseRpt, Map<String, String> params);

    /**
     * 获取查询SQL
     * @param baseRpt
     * @param params
     * @return
     */
    String getQuery(BaseRpt baseRpt, Map<String, String> params);

    /**
     * 获取分页查询SQL
     * @param baseRpt 报表实体信息
     * @param params 查询条件
     * @param startIndex 分页起始行
     * @param endIndex 分页结束行
     * @return
     */
    String getQuerySQLByPage(BaseRpt baseRpt, Map<String, String> params, int startIndex, int endIndex);

    /**
     * 获取报表汇总SQL
     * @param baseRpt 报表实体信息
     * @param params 查询条件
     * @return
     */
    String getSumSQL(BaseRpt baseRpt, Map<String, String> params);

    /**
     * 查询报表数据量
     * @param baseRpt 报表实体信息
     * @param params 查询条件
     * @return
     */
    int getRptDataCount(BaseRpt baseRpt, Map<String, String> params);

    /**
     * 分页获取报表信息
     * @param baseRpt 报表实体信息
     * @param params 查询条件
     * @param startIndex 分页起始行
     * @param endIndex 分页结束行
     * @return
     */
    List<Map<String, Object>> getRptDataByPage(BaseRpt baseRpt, Map<String, String> params, int startIndex, int endIndex);

    /**
     * 获取报表汇总数据
     * @param baseRpt 报表实体信息
     * @param params 查询条件
     * @return
     */
    List<Map<String, Object>> getRptDataSum(BaseRpt baseRpt, Map<String, String> params);

    /**
     * 报表导出
     * 由于报表导出时查询的数据量比较大，dubbo前后台交互时有数据量大小的限制
     * 所以报表导出需要在后台完成，这样无需将查询出的数据传递至前台
     * @param rptInfo  报表信息
     * @param rptId  报表ID
     * @param rptHeaderFilePath 报表表头Excel文件的路径
     * @param selectRptIdx 选中的指标
     * @param selectRptDim 选中的维度
     * @param params 查询参数
     * @return
     */
    String downLoadExcel(BaseRpt rptInfo, String rptId, String rptHeaderFilePath, String selectRptIdx, String selectRptDim, Map<String, String> params);
}
